package com.ruoyi.fin.service.impl;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.fin.mapper.FinTransactionMapper;
import com.ruoyi.fin.domain.FinTransaction;
import com.ruoyi.fin.service.IFinTransactionService;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.api.event.EventPublisher;
import com.ruoyi.api.event.EventType;
import com.ruoyi.api.event.TransactionEvent;

/**
 * 财务交易记录Service业务层处理
 * 
 * @author ruoyi
 * @date 2025-06-19
 */
@Service
public class FinTransactionServiceImpl implements IFinTransactionService 
{
    @Autowired
    private FinTransactionMapper finTransactionMapper;
    
    @Autowired
    private EventPublisher eventPublisher;

    /**
     * 查询财务交易记录
     * 
     * @param id 财务交易记录主键
     * @return 财务交易记录
     */
    @Override
    public FinTransaction selectFinTransactionById(Long id)
    {
        return finTransactionMapper.selectFinTransactionById(id);
    }

    /**
     * 查询财务交易记录列表
     * 
     * @param finTransaction 财务交易记录
     * @return 财务交易记录
     */
    @Override
    public List<FinTransaction> selectFinTransactionList(FinTransaction finTransaction)
    {
        return finTransactionMapper.selectFinTransactionList(finTransaction);
    }

    /**
     * 新增财务交易记录
     * 
     * @param finTransaction 财务交易记录
     * @return 结果
     */
    @Override
    public int insertFinTransaction(FinTransaction finTransaction)
    {
        int rows = finTransactionMapper.insertFinTransaction(finTransaction);
        
        // 发布交易记录添加事件
        if (rows > 0) {
            publishTransactionEvent(finTransaction, EventType.TRANSACTION_ADDED);
        }
        
        return rows;
    }

    /**
     * 修改财务交易记录
     * 
     * @param finTransaction 财务交易记录
     * @return 结果
     */
    @Override
    public int updateFinTransaction(FinTransaction finTransaction)
    {
        // 获取原交易记录
        FinTransaction oldTransaction = finTransactionMapper.selectFinTransactionById(finTransaction.getId());
        
        // 执行更新
        int rows = finTransactionMapper.updateFinTransaction(finTransaction);
        
        // 如果金额或账户发生变化，需要更新余额
        if (rows > 0 && (
                !oldTransaction.getAmount().equals(finTransaction.getAmount()) || 
                !oldTransaction.getAccountId().equals(finTransaction.getAccountId()))) {
            
            // 发布删除旧交易记录事件
            publishTransactionEvent(oldTransaction, EventType.TRANSACTION_DELETED);
            
            // 发布添加新交易记录事件
            publishTransactionEvent(finTransaction, EventType.TRANSACTION_ADDED);
        }
        
        return rows;
    }

    /**
     * 批量删除财务交易记录
     * 
     * @param ids 需要删除的财务交易记录主键
     * @return 结果
     */
    @Override
    public int deleteFinTransactionByIds(String ids)
    {
        String[] idArray = Convert.toStrArray(ids);
        
        // 获取要删除的所有交易记录，并发布删除事件
        for (String idStr : idArray) {
            Long id = Long.valueOf(idStr);
            FinTransaction transaction = finTransactionMapper.selectFinTransactionById(id);
            if (transaction != null) {
                publishTransactionEvent(transaction, EventType.TRANSACTION_DELETED);
            }
        }
        
        return finTransactionMapper.deleteFinTransactionByIds(idArray);
    }

    /**
     * 删除财务交易记录信息
     * 
     * @param id 财务交易记录主键
     * @return 结果
     */
    @Override
    public int deleteFinTransactionById(Long id)
    {
        // 获取要删除的交易记录，并发布删除事件
        FinTransaction transaction = finTransactionMapper.selectFinTransactionById(id);
        if (transaction != null) {
            publishTransactionEvent(transaction, EventType.TRANSACTION_DELETED);
        }
        
        return finTransactionMapper.deleteFinTransactionById(id);
    }
    
    /**
     * 从采购订单创建财务交易记录（支出）
     * 
     * @param purchaseOrderId 采购订单ID
     * @param accountId 账户ID，如果为null则使用默认账户
     * @return 结果
     */
    @Override
    public int createTransactionFromPurchase(Long purchaseOrderId, Long accountId)
    {
        // 此方法已通过事件监听器实现，不再需要直接调用采购模块
        // 保留API接口用于手动触发
        return 0;
    }
    
    /**
     * 从销售订单创建财务交易记录（收入）
     * 
     * @param salesOrderId 销售订单ID
     * @param accountId 账户ID，如果为null则使用默认账户
     * @return 结果
     */
    @Override
    public int createTransactionFromSales(Long salesOrderId, Long accountId)
    {
        // 此方法已通过事件监听器实现，不再需要直接调用销售模块
        // 保留API接口用于手动触发
        return 0;
    }
    
    /**
     * 发布交易记录事件
     * 
     * @param transaction 交易记录
     * @param eventType 事件类型
     */
    private void publishTransactionEvent(FinTransaction transaction, EventType eventType) {
        TransactionEvent event = new TransactionEvent(
                eventType,
                transaction.getId(),
                transaction.getTransactionNo(),
                transaction.getAccountId(),
                transaction.getAmount(),
                transaction.getType(),
                transaction.getTransactionDate(),
                transaction.getDescription(),
                transaction.getSourceType(),
                transaction.getSourceId()
        );
        
        eventPublisher.publishEvent(event);
    }
}
